package com.ias.redis.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;


import java.time.Duration;

/**
 * Redis配置属性
 *
 * @author IAS Team
 * @version 2.0.0
 */
@Data
@Validated
@ConfigurationProperties(prefix = "ias.redis")
public class RedisProperties {

    /**
     * 是否启用Redis自动配置
     */
    private boolean enabled = true;

    /**
     * 缓存配置
     */
    private Cache cache = new Cache();

    /**
     * 序列化配置
     */
    private Serialization serialization = new Serialization();

    /**
     * 布隆过滤器配置
     */
    private BloomFilter bloomFilter = new BloomFilter();

    /**
     * 缓存配置
     */
    @Data
    public static class Cache {
        /**
         * 默认缓存过期时间
         */
        private Duration defaultTtl = Duration.ofHours(1);

        /**
         * 是否允许缓存null值
         */
        private boolean allowNullValues = false;

        /**
         * 缓存key前缀
         */
        private String keyPrefix = "ias:cache:";

        /**
         * 是否使用key前缀
         */
        private boolean useKeyPrefix = true;
    }

    /**
     * 序列化配置
     */
    @Data
    public static class Serialization {
        /**
         * 序列化类型
         */
        private SerializationType type = SerializationType.JACKSON;

        /**
         * 是否压缩
         */
        private boolean compress = false;

        /**
         * 压缩阈值（字节）
         */
        private int compressThreshold = 1024;
    }

    /**
     * 布隆过滤器配置
     */
    @Data
    public static class BloomFilter {
        /**
         * 是否启用布隆过滤器
         */
        private boolean enabled = false;

        /**
         * 预期插入数量
         */
        private long expectedInsertions = 1000000L;

        /**
         * 误判率
         */
        private double fpp = 0.01;

        /**
         * 布隆过滤器名称
         */
        private String name = "ias:bloom:filter";
    }

    /**
     * 序列化类型枚举
     */
    public enum SerializationType {
        /**
         * Jackson JSON序列化
         */
        JACKSON,

        /**
         * Java原生序列化
         */
        JDK,

        /**
         * Protostuff序列化
         */
        PROTOSTUFF
    }
} 